package com.adtech.farmProducts.base;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.gyf.barlibrary.ImmersionBar;
import com.vise.log.ViseLog;
import com.adtech.common.http.AsyncHttpResponse;
import com.adtech.common.model.RspModel;
import com.adtech.common.widgets.dialog.LoadingDialog;
import com.adtech.common.widgets.load.core.LoadManager;
import com.adtech.farmProducts.App;
import com.adtech.farmProducts.R;
import com.adtech.farmProducts.widget.EmptyView;
import com.adtech.farmProducts.widget.ErrorView;

import java.lang.reflect.Type;

import butterknife.ButterKnife;
import butterknife.Unbinder;


/**
 * Descr:   Activity活动的基类
 * Author:  xiaocz.
 * Date:    2018/1/19.
 */

public abstract class NativeActivity extends Activity {

    // 目标打印标识
    protected static String TAG;

    // 上下文对象getVersionCode
    protected Context mContext;


    private Unbinder unbinder;

    /**
     * 启动Activity时执行的方法
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 如果能正常接收上一界面传递过来的参数则显示当前界面
        // 否则关闭当前界面的显示
        // 默认无参数传递的情况下是正常显示当前界面的
        if (initArgs(getIntent().getExtras())) {
            // 初始化目标打印标识
            TAG = this.getClass().getSimpleName();

            // 初始化上下文对象
            mContext = this;

            // 加载布局界面
            setContentView(getLayoutSourceId());

            //绑定初始化ButterKnife
            unbinder = ButterKnife.bind(this);

            // 初始化控件之前调用
            init(savedInstanceState);

            // 初始化布局控件
            initWidgets();

            // 初始化数据
            initData();
        } else {
            finish();
        }
    }

    /**
     * 初始化沉浸式
     * Init immersion bar.
     */
    protected void initImmersionBar() {
        // 初始化沉浸式状态栏框架
        ImmersionBar.with(this)
                .statusBarColor(R.color.colorPrimary).keyboardEnable(false)//键盘
                .navigationBarColor(R.color.colorAccent)
                .fullScreen(false).statusBarDarkFont(true, 0.2f)//原前设备支持状态栏字体变色，会设置状态栏字体为黑色，如果当前设理：如果当备不支持状态栏字体变色，会使当前状态栏加上透明度，否则不执行透明度
                .init();
    }

    private LoadingDialog loadingDialog;

    /**
     * @param canBack true 可以取消 false 不可以取消 设置在点击Dialog外是否取消Dialog进度条
     */
    public void loadingDialogShow(boolean canBack, int view) {
        if (loadingDialog != null) {
            loadingDialog.cancel();
        } else {
            loadingDialog = new LoadingDialog(this);
        }
        loadingDialog.show(canBack, view);
    }

    public void loadingDialogShow(boolean canBack) {
        if (loadingDialog != null) {
            loadingDialog.cancel();
        } else {
            loadingDialog = new LoadingDialog(this);
        }
        loadingDialog.show(canBack, R.layout.layout_state_loading);
    }

    public void onDismiss() {
        if (loadingDialog != null) {
            loadingDialog.dismiss();
            loadingDialog = null;
        }
    }

    /**
     * 销毁
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
        ImmersionBar.with(this).destroy(); //必须调用该方法，防止内存泄漏
    }

    /**
     * 初始化接收上一界面传递过来的参数
     *
     * @param bundle 用于接收参数的Bundle对象
     * @return 返回true表示接收参数成功，返回false表示接收参数失败（默认返回true）
     */
    protected boolean initArgs(Bundle bundle) {
        return true;
    }


    /**
     * 初始化获取界面布局资源ID（子类必须实现）
     *
     * @return 界面布局资源的ID
     */
    protected abstract int getLayoutSourceId();


    /**
     * 初始化控件之前调用
     */
    protected void init(Bundle savedInstanceState) {
    }


    /**
     * 初始化布局控件
     */
    protected void initWidgets() {
    }


    /**
     * 初始化数据
     */
    protected void initData() {
    }

    public <T> RspModel<T> getAnalysis(AsyncHttpResponse response, Type type, String log) {
        ViseLog.d(getClass().getSimpleName() + ":" + response.toString());
        switch (response.getCode()) {
            case 200:
                try {
                    RspModel<T> rspModel = new Gson().fromJson(response.getBody(), type);
                    ViseLog.e(log + rspModel.toString());
                    return rspModel;
                } catch (JsonSyntaxException e) {
                    e.printStackTrace();
                }
                break;
            default:
                App.getInstance().showMessage(getString(R.string.service_error));
                break;
        }
        return null;
    }



    /**
     * 数据解析
     *
     * @param response 数据源
     * @param type     class
     * @param log      log
     * @param <T>      泛型
     * @return 结果
     */
    public <T> RspModel<T> getAnalysisBase(LoadManager mLoadManager, AsyncHttpResponse response, Type type, String log) {
        ViseLog.d(response.toString());
        switch (response.getCode()) {
            case 200:
                try {
                    RspModel<T> rspModel = new Gson().fromJson(response.getBody(), type);
                    ViseLog.e(log + rspModel.toString());
                    switch (rspModel.getCode()) {
                        case 200:
                            mLoadManager.showSuccessView();
                            return rspModel;
                        default:
                            App.getInstance().showMessage(rspModel.getMessage());
                            mLoadManager.showStateView(EmptyView.class);
                            break;
                    }
                } catch (JsonSyntaxException e) {
                    e.printStackTrace();
                    mLoadManager.showStateView(ErrorView.class);
                }
                break;
            default:
                mLoadManager.showStateView(EmptyView.class);
                break;
        }
        return null;
    }

    /**
     * 隐藏软键盘
     **/
    public void hideKeyboard() {
        View view = getWindow().peekDecorView();
        if (view != null) {
            InputMethodManager inputmanger = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
